﻿using System.Collections.Generic;
using System.Timers;

namespace 键盘监控器
{
    public class KeyQueue<T>
    {
        private readonly Queue<T> _queue = new Queue<T>();

        private static Timer _timer;

        // 获取队列中的元素个数
        public int Count => _queue.Count;

        // 定义一个委托，用来给事件返回数据
        public delegate void QueueCallback(Queue<T> item, int cont);

        // 定义一个事件，当队列变化时触发
        public event QueueCallback QueueChanged;

        public KeyQueue()
        {
            // 创建一个定时器，设置时间间隔为 1000 毫秒（1秒）
            _timer = new Timer(1000);

            // 定义定时器触发时的事件处理方法
            _timer.Elapsed += OnTimedEvent;

            // 设置定时器是否自动重复
            _timer.AutoReset = true;

            // 启动定时器
            _timer.Start();
        }

        // 析构方法
        ~KeyQueue()
        {
            // 停止定时器
            _timer.Stop();
            _timer.Dispose();
        }

        // 每隔一秒清除第一个元素
        private void OnTimedEvent(object sender, ElapsedEventArgs e)
        {
            if (_queue.Count < 5)
            {
                this.Dequeue();
            }
            if (_queue.Count > 5)
            {
                this.Dequeue();
                this.Dequeue();
                this.Dequeue();
            }
        }

        // 入队方法
        public void Enqueue(T item)
        {
            _queue.Enqueue(item); // 添加元素
            QueueChanged?.Invoke(_queue, _queue.Count); // 触发事件，传递当前队列元素个数
        }

        // 出队方法
        public T Dequeue()
        {
            T item = _queue.Dequeue(); // 移除元素
            QueueChanged?.Invoke(_queue, _queue.Count); // 触发事件，传递当前队列元素个数
            return item;
        }

        // 清空队列
        public void Clear()
        {
            _queue.Clear();
            QueueChanged?.Invoke(_queue, _queue.Count); // 触发事件，传递当前队列元素个数
        }

    }
}
